

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import messages.*;

public class Emetteur {

	public static final int DEST_PORT = 2013; 
	public static final int LISTENED_PORT = 2014; 
	
	public static void sendFile(Socket socket, File file){
		InputStream fichierDEntree;
		OutputStream fichierDeSortie;
		
		try {
			fichierDEntree = new FileInputStream(file);
			fichierDeSortie = socket.getOutputStream();
			
			byte[] toSend = new byte[4096];
			int i;
			while (( i = fichierDEntree.read(toSend, 0, 4096)) != -1){
				fichierDeSortie.write(toSend, 0, i);
			}
			fichierDEntree.close();
			fichierDeSortie.close();
			socket.close();
			
		} catch (IOException e) {
			System.out.println("Problème avec la socket");
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		Socket socket;
		try {
			socket = new Socket (InetAddress.getByName("127.0.0.1"), 1236);
			File fichier = new File("/home/guillaume/Indochine - 3 nuits par semaine.mp3");
			sendFile(socket, fichier);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
		
		//		try {
//			
//			boolean request;
//			boolean accepted;
//
//
///*--------------------------------------------------------------------------------------*/
///*Emission d'un Hello demandant un ack -------------------------------------------------*/	
//			byte[] myHelloByteArray;
//			DatagramSocket mySocketEnvoi;
//			
//			
//			System.out.println("Envoie d'un Hello");
//			
//			myHelloByteArray = MessagesFactory.getHello("SergentGarcia", true);
//			
//			mySocketEnvoi = new DatagramSocket();
//			mySocketEnvoi.send(new DatagramPacket(myHelloByteArray, myHelloByteArray.length, 
//										      InetAddress.getByName("255.255.255.255"), DEST_PORT));		
//			
//			System.out.println("Hello Envoyé\n");
//			
///*---------------------------------------------------------------------------------------*/
///*Attente et réception d'un message------------------------------------------------------*/	
//			//mySocket = null;
//			DatagramSocket mySocketEcoute;
//			DatagramPacket myPacket;
//			byte[] recvData;
//			
//			
//			mySocketEcoute = new DatagramSocket(LISTENED_PORT);
//			int size = mySocketEcoute.getReceiveBufferSize(); //récupère taille buffer réception
//			recvData = new byte[size];
//			myPacket = new DatagramPacket(recvData, recvData.length);
//			mySocketEcoute.receive(myPacket);
//
//			System.out.println("Attente d'un message\n");
//			
//			Message recvMessage = MessagesFactory.getMessage(myPacket.getData());
//
//			System.out.println("Un message à été reçu");
//			System.out.println("Le message est du type " + recvMessage.getClass());
//			System.out.println("Il vient de " + recvMessage.getUsername() + "@" + recvMessage.getHostName());
//
//			if (recvMessage instanceof Hello) {
//				if (((Hello)recvMessage).getWaitAck()) {
//					System.out.println("L'application distante attend un ack\n");
//				}
//				else {
//					System.out.println("L'application distante n'attend pas de ack\n");
//				}
//			}
//			
///*---------------------------------------------------------------------------------------*/
///*Emmission d'un ChatMessage-------------------------------------------------------------*/
//			mySocketEnvoi = null;
//			byte[] myChatMessageByteArray;
//			System.out.println("envoi d'un message");
//			
//			mySocketEnvoi = new DatagramSocket();
//			myChatMessageByteArray = MessagesFactory.getChatMessage("SergentGarcia", "est-ce que ça marche ?");
//			mySocketEnvoi.send(new DatagramPacket(myChatMessageByteArray,
//									myChatMessageByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
//			
//			System.out.println("Message envoyé !!");
//			
///*---------------------------------------------------------------------------------------*/
///*Reception d'un ChatMessage (ou autre si affinité)--------------------------------------*/
//
//			recvData = null;
//			myPacket=null;
//						
//			//mySocket = new DatagramSocket(12345);
//			size = mySocketEcoute.getReceiveBufferSize(); //récupère taille buffer réception
//			System.out.println("j'ai reçu qq chose");
//			recvData = new byte[size];
//			myPacket = new DatagramPacket(recvData, recvData.length);
//			System.out.println("extraction paquet");
//			mySocketEcoute.receive(myPacket);
//			System.out.println("Attente d'un message\n");
//			recvMessage = MessagesFactory.getMessage(myPacket.getData());
//			System.out.println("Un message à été reçu");
//			System.out.println("Le message est du type " + recvMessage.getClass());
//			System.out.println("Il vient de " + recvMessage.getUsername() + "@" + recvMessage.getHostName());
//
//			if (recvMessage instanceof Hello) {
//				if (((Hello)recvMessage).getWaitAck()) {
//					System.out.println("L'application distante attend un ack\n");
//				}
//				else {
//					System.out.println("L'application distante n'attend pas de ack\n");
//				}
//			}
//			else if (recvMessage instanceof ChatMessage){
//				System.out.println("Le message suivant a été reçu :");
//				System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " : " + ((ChatMessage)recvMessage).getMsgToSend());
//			}
//			
///*---------------------------------------------------------------------------------------*/
///*Envoie d'une demande de reception d'un fichier-----------------------------------------*/
//			
//			
//			mySocketEnvoi = null;
//			File fichier = new File("/home/guillaume/workspace/Test/Indochine - 3 nuits par semaine.mp3");
//			String nomFicher = fichier.getName();
//			byte[] myFileNotifByteArray;
//			System.out.println("envoi d'une demande de reception");
//			
//			mySocketEnvoi = new DatagramSocket();
//			myFileNotifByteArray = MessagesFactory.getFileNotif("SergentGarcia", nomFicher, true, false);
//			mySocketEnvoi.send(new DatagramPacket(myFileNotifByteArray,
//					myFileNotifByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
//			System.out.println("demande de réception envoyée !!");
//			
///*---------------------------------------------------------------------------------------*/
///*Attente et réception d'une demande de reception de fichier-----------------------------*/	
//
//			recvData = null;
//			myPacket=null;
//
//			size = mySocketEcoute.getReceiveBufferSize(); //récupère taille buffer réception
//			System.out.println("j'ai reçu qq chose");
//			recvData = new byte[size];
//			myPacket = new DatagramPacket(recvData, recvData.length);
//			System.out.println("extraction paquet");
//			mySocketEcoute.receive(myPacket);
//			System.out.println("Attente d'un message\n");
//			recvMessage = MessagesFactory.getMessage(myPacket.getData());
//			System.out.println("Un message à été reçu");
//			System.out.println("Le message est du type " + recvMessage.getClass());
//			System.out.println("Il vient de " + recvMessage.getUsername() + "@" + recvMessage.getHostName());
//
//			if (recvMessage instanceof Hello) {
//				if (((Hello)recvMessage).getWaitAck()) {
//					System.out.println("L'application distante attend un ack\n");
//				}
//				else {
//					System.out.println("L'application distante n'attend pas de ack\n");
//				}
//			}
//			else if (recvMessage instanceof ChatMessage){
//				System.out.println("Le message suivant a été reçu :");
//				System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " : " + ((ChatMessage)recvMessage).getMsgToSend());
//			}
//			else if (recvMessage instanceof FileNotif){
//				/*-------------------------------------
//				 * On reçoit une demande de fichier----
//							 -------------------------------------*/
//				if (((FileNotif)recvMessage).getRequest() == true){
//					System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " souhaite vous envoyez le fichier suivant : " + 
//							((FileNotif)recvMessage).getNameFile() + " voulez-vous l'accepter ?");
//					request=false;
//					accepted = true;
//					/*-------------------------------------
//					 * On accepte le fichier---------------
//								 -------------------------------------*/
//					mySocketEnvoi = null;
//					String nameFicher = ((FileNotif)recvMessage).getNameFile();
//					myFileNotifByteArray=null;
//					System.out.println("envoi d'une acceptation de reception");
//
//					mySocketEnvoi = new DatagramSocket();
//					myFileNotifByteArray = MessagesFactory.getFileNotif("SergentGarcia", nameFicher, request, accepted);
//					mySocketEnvoi.send(new DatagramPacket(myFileNotifByteArray,
//							myFileNotifByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
//					System.out.println("Acceptation envoyée !!");
//
//				}
//				else if (((FileNotif)recvMessage).getRequest() == true){
//					System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " souhaite vous envoyez le fichier suivant : " + 
//							((FileNotif)recvMessage).getNameFile() + " voulez-vous l'accepter ?");
//					request=false;
//					accepted = false;
//					/*-------------------------------------
//					 * On refuse le fichier---------------
//								 -------------------------------------*/
//					mySocketEnvoi = null;
//					String nameFicher = ((FileNotif)recvMessage).getNameFile();
//					myFileNotifByteArray=null;
//					System.out.println("envoi d'une acceptation de reception");
//
//					mySocketEnvoi = new DatagramSocket();
//					myFileNotifByteArray = MessagesFactory.getFileNotif("SergentGarcia", nomFicher, request, accepted);
//					mySocketEnvoi.send(new DatagramPacket(myFileNotifByteArray,
//							myFileNotifByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
//					System.out.println("Acceptation envoyée !!");
//
//				}
//				/*-------------------------------------
//				 * On reçoit un acceptation de fichier-
//							 -------------------------------------*/
//				else if ((((FileNotif)recvMessage).getRequest() == false) && ((((FileNotif)recvMessage).getAccepted() == true))){
//					System.out.println("Le fichier a était accepté il va s'envoyer !");
//
//				}
//			}
//			
			
/*		} catch (SocketException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (MessageCreationException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}*/

}